5 de Mayo de 2018

Objetivo

Entender cómo usar los datos geolocalizados para problemas inmobiliarios

En especial

  • Entender cuáles son los factores que importan más en el precio de una casa

  • Modelizar el precio de un inmueble de acuerdo a variables geo-espaciales

  • Visualizar el mercado de oferta de viviendas

Location Intelligence en el mercado inmobiliario

Uno de los sectores en el que Location Intelligence es más importante es del mercado inmobiliario.

De hecho una de las máximas del mercado inmobiliario es que las tres cosas que más importan para el precio de una casa son:

"Location, Location, Location"

Entender mejor cómo las variables geo-espaciales influyen en el precio de un inmueble y en sus cambios nos permite:

  • Manejar mejor las carteras de inmuebles (inversores)

  • Detectar oportunidades de inversión (inversores, compradores)

  • Mejorar las promociones de nuevos inmuebles

Location Intelligence en el mercado inmobiliario

Hay mucha literatura sobre cuáles son las variables del barrio y de la ciudad que más afectan al precio de un inmueble. Por ejemplo:

  • La distancia al centro

  • El tener una parada de metro cerca

  • El hecho de que sea una zona nueva

  • Que haya otros medios de transporte

  • Que haya un parque cerca. O un supermercado

  • O que no haya cierto tipos de negocio cerca

  • El nivel de ruido/contaminación de la zona, etc.

Todas estas variables son de Location Intelligence.

Location Intelligence en el mercado inmobiliario

La visualización y sobre todo la modelización de cómo impactan estas variables en el precio es lo que hace que Location Intelligence sea tan importante en el mercado inmobiliario.

En España hay varias empresas que dan este tipo de servicios de Location Intelligence

y en otros países:

Location Intelligence en el mercado inmobiliario

Y qué variables son las más importantes? Muchas. Recomiendo leer el libro editado por Zillow

  • Propiedades de la casa
    • Superficie
    • Número de habitaciones
    • Instalaciones
    • Etc.
  • Propiedades del vecindario
    • Transporte
    • Zona urbana/suburbana
    • Tiendas
    • Instalaciones
    • Etc.

Taller: Precio de vivienda en Madrid

Vamos a ver un ejemplo de cómo utilizar variables geo-espaciales para enteder el precio de la vivienda en Madrid. Para ello vamos a utilizar una lista de precio de viviendas.

precios_vivienda <- fread("./data/precios_vivienda.csv")
head(precios_vivienda,4)
##    bathrooms exterior  price rooms size longitude latitude
## 1:         1     TRUE  56050     3   60 -3.614164 40.40848
## 2:         2     TRUE 160000     3  107 -3.641696 40.38688
## 3:         2     TRUE 645000     3  154 -3.674424 40.42397
## 4:         1     TRUE 150000     1   55 -3.668896 40.40165

Como vemos cada vivienda viene definida por su geolocalización y una serie de propiedades de ella, incluyendo el precio y superficie.

Taller: Precio de vivienda en Madrid

Los precios tienen mucha variabilidad

ggplot(precios_vivienda,aes(x=price)) + geom_density(fill="red") + scale_x_log10()

Taller: Precio de vivienda en Madrid

Quitamos las casas que valen menos de 50000€.

precios_vivienda<- precios_vivienda[price>50000]

Así varía el precio por metro cuadrado

ggplot(precios_vivienda,aes(x=price/size)) + geom_density(fill="red") + scale_x_log10()

Taller: Precio de vivienda en Madrid

El precio varia entre

range(precios_vivienda$price)
## [1]    50106 40000000

Donde el precio medio por metro cuadrado es

mean(precios_vivienda$price/precios_vivienda$size)
## [1] 3042.672

Taller: Precio de vivienda en Madrid

Vamos a visualizar cómo depende el precio de la vivienda para cada uno de los barrios de Madrid. Para ello lo primero es situar cada inmueble en su barrio

Cargamos los shapefiles de los barrios de Madrid

barrios <- readOGR("/Users/emoro/Programas/CursoLocationIntelligence/Talleres/data/Barrios Madrid/",layer="200001469",stringsAsFactors = F,encoding = "latin1")
## OGR data source with driver: ESRI Shapefile 
## Source: "/Users/emoro/Programas/CursoLocationIntelligence/Talleres/data/Barrios Madrid/", layer: "200001469"
## with 128 features
## It has 3 fields

Como siempre utilizamos la proyección WGS84

WGS84 <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
mapb <- spTransform(barrios,CRSobj=WGS84)

Taller: Precio de vivienda en Madrid

Utilizamos la funcion over para saber en qué barrio está cada uno de los inmuebles

pps <- SpatialPoints(cbind(precios_vivienda$longitude,
                           precios_vivienda$latitude),proj4str=WGS84)
oo <- over(pps,as(mapb,"SpatialPolygons"))

Y añadimos una columna a los inmuebles que refleje su barrio

precios_vivienda$barrio <- mapb@data$DESBDT[oo]
head(precios_vivienda,3)
##    bathrooms exterior  price rooms size longitude latitude
## 1:         1     TRUE  56050     3   60 -3.614164 40.40848
## 2:         2     TRUE 160000     3  107 -3.641696 40.38688
## 3:         2     TRUE 645000     3  154 -3.674424 40.42397
##                   barrio
## 1:            192 Ambroz
## 2: 134 Palomeras Sureste
## 3:              042 Goya

Taller: Precio de vivienda en Madrid

Calculamos el promedio del precio por metro cuadrado y el número de inmuebles para cada barrio

precios_barrio <- precios_vivienda[,.(precio_medio_m2=mean(price/size),num_inmuebles=length(price)),.(barrio)]
head(precios_barrio,3)
##                   barrio precio_medio_m2 num_inmuebles
## 1:            192 Ambroz        1683.908            63
## 2: 134 Palomeras Sureste        1749.410           308
## 3:              042 Goya        4027.770           672

Ponemos esa información en los datos del mapa

mapb2 <- merge(mapb,precios_barrio,by.x="DESBDT",by.y="barrio")

Taller: Precio de vivienda en Madrid

Visualizamos el precio medio como un choropleth

pal <- colorNumeric(palette = "Blues",domain = mapb2$precio_medio_m2)
leaflet(mapb2) %>% addTiles() %>% 
  addPolygons(fillColor =~pal(precio_medio_m2),stroke = F,
              popup=~paste(DESBDT,"<br>",precio_medio_m2),fillOpacity = 0.9)

Taller: Modelización precio vivienda en Madrid

Como hemos visto, la principal variable que explica el precio de la vivienda es la superficie

ggplot(precios_vivienda,aes(x=size,y=price)) + geom_point() + stat_smooth() + scale_x_log10() + scale_y_log10()

Taller: Modelización precio vivienda en Madrid

Lo cual se refleja en un simple modelo

fit <- lm(log(price) ~ log(size), data=precios_vivienda)
summary(fit)
## 
## Call:
## lm(formula = log(price) ~ log(size), data = precios_vivienda)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0661 -0.2976  0.0278  0.3185  3.9290 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 6.807184   0.017469   389.7   <2e-16 ***
## log(size)   1.232795   0.003666   336.2   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4597 on 36160 degrees of freedom
## Multiple R-squared:  0.7577, Adjusted R-squared:  0.7577 
## F-statistic: 1.131e+05 on 1 and 36160 DF,  p-value: < 2.2e-16

Taller: Modelización precio vivienda en Madrid

¿Cómo influyen las otras propiedades del inmueble? Hacemos un modelo que incluya el número de habitaciones, si es exterior o no, etc

fit <- lm(log(price) ~ log(size) + rooms + as.factor(exterior)+bathrooms, data = precios_vivienda)
summary(fit)
## 
## Call:
## lm(formula = log(price) ~ log(size) + rooms + as.factor(exterior) + 
##     bathrooms, data = precios_vivienda)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1996 -0.2877  0.0286  0.3026  3.8231 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              6.894173   0.026703  258.18   <2e-16 ***
## log(size)                1.230833   0.007071  174.06   <2e-16 ***
## rooms                   -0.135325   0.002486  -54.44   <2e-16 ***
## as.factor(exterior)TRUE  0.059753   0.005426   11.01   <2e-16 ***
## bathrooms                0.139772   0.003348   41.75   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.437 on 36157 degrees of freedom
## Multiple R-squared:  0.7811, Adjusted R-squared:  0.781 
## F-statistic: 3.225e+04 on 4 and 36157 DF,  p-value: < 2.2e-16

Taller: Modelización precio vivienda en Madrid

Veamos ahora cómo influyen las variables de localización. Por ejemplo, la distancia al centro. Añadimos una columna a los datos que nos de la distancia al centro

lon_center <- -3.70379 #centro de Madrid = Plaza del Sol
lat_center <- 40.416775
dist_center <- spDistsN1(cbind(precios_vivienda$longitude,precios_vivienda$latitude),
                         c(lon_center,lat_center),longlat = T)
precios_vivienda$dist_center <- dist_center

Y modelizamos de nuevo

fit <- lm(log(price) ~ log(size) + rooms + as.factor(exterior) + 
            bathrooms + dist_center, data = precios_vivienda)
summary(fit)$coefficients
##                            Estimate   Std. Error   t value     Pr(>|t|)
## (Intercept)              7.16879575 0.0253404259 282.89958 0.000000e+00
## log(size)                1.22603430 0.0066308731 184.89787 0.000000e+00
## rooms                   -0.14023514 0.0023319840 -60.13555 0.000000e+00
## as.factor(exterior)TRUE  0.05501065 0.0050882536  10.81130 3.349364e-27
## bathrooms                0.16119909 0.0031536090  51.11575 0.000000e+00
## dist_center             -0.05408522 0.0007674581 -70.47319 0.000000e+00

Taller: Modelización precio vivienda en Madrid

Aunque el modelo ya es muy bueno, vamos a ver si el error es diferente por barrios

precios_vivienda$fitted <- fitted(fit)
error_barrios <- precios_vivienda[,.(MAE_medio=mean(abs(log(price)-fitted)/fitted)),.(barrio)]

donde vemos que hay barrios donde el modelo tiene mucho error

error_barrios[MAE_medio > 0.04]
##                 barrio  MAE_medio
## 1:       132 San Diego 0.04072329
## 2: 133 Palomeras Bajas 0.04170818
## 3:       131 Entrevías 0.05383612
## 4:    101 Los Cármenes 0.04075591
## 5:           126 Zofío 0.04077187
## 6:      127 Pradolongo 0.04678470
## 7:        135 Portazgo 0.04048617
## 8:        081 El Pardo 0.04086474
## 9:       121 Orcasitas 0.04864042

Taller: Modelización precio vivienda en Madrid

Visualizamos ese error

mapb2 <- merge(mapb2,error_barrios,by.x="DESBDT",by.y="barrio")
pal <- colorNumeric(palette = "Blues",domain = mapb2$MAE_medio)
leaflet(mapb2) %>% addTiles() %>% 
  addPolygons(fillColor =~pal(MAE_medio),stroke = F,
              popup=~paste(DESBDT,"<br>",MAE_medio),fillOpacity = 0.9)

Ejercicio 1: Efecto de la distancia al metro

Vamos a ver si el que el inmueble esté cerca del metro tiene algún efecto en el precio. Para ello nos bajamos la geolocalización de las paradas de metro de Nomecalles

bocas <- readOGR(dsn="./data/Transportes y comunicaciones_ Metro (bocas)/",layer="bocas")
## OGR data source with driver: ESRI Shapefile 
## Source: "./data/Transportes y comunicaciones_ Metro (bocas)/", layer: "bocas"
## with 740 features
## It has 7 fields
## Integer64 fields read as strings:  UTM_Y

Y las transformamos a lat/long

WGS84 <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
bocas2 <- spTransform(bocas,CRSobj=WGS84)

Ponemos la latitud y la longitud en los datos

cc <- coordinates(bocas2)
bocas2@data$lon <- cc[,1]
bocas2@data$lat <- cc[,2]

Ejercicio 1: Efecto de la distancia al metro

Ahora tenemos que determinar la distancia a la boca de metro más cercana. Definimos una función que, a partir de un punto nos da la distancia más corta a una boca de metro

distance_boca <- function(lon,lat){
  dd <- spDistsN1(cbind(bocas2@data$lon,bocas2@data$lat),c(lon,lat),longlat = T)
  min(dd)
}

Por ejemplo la distancia a la boca más cercana del centro de la Puerta del Sol es

distance_boca(lon_center,lat_center)
## [1] 0.02822047

es decir, apenas unos metros

Ejercicio 1: Efecto de la distancia al metro

Calculamos la distancia a cada uno de los inmuebles

precios_vivienda[, distancia_metro:=mapply(distance_boca,longitude,latitude)]

Influye?

fit <- lm(log(price) ~ log(size) + rooms + as.factor(exterior) + 
            bathrooms + dist_center + distancia_metro, data = precios_vivienda)
summary(fit)$coefficients
##                            Estimate   Std. Error    t value     Pr(>|t|)
## (Intercept)              7.12981150 0.0253135118 281.660307 0.000000e+00
## log(size)                1.23574232 0.0066216229 186.622272 0.000000e+00
## rooms                   -0.14270249 0.0023251666 -61.373016 0.000000e+00
## as.factor(exterior)TRUE  0.04302030 0.0051069635   8.423851 3.775649e-17
## bathrooms                0.16583235 0.0031492804  52.657220 0.000000e+00
## dist_center             -0.04563210 0.0008924292 -51.132455 0.000000e+00
## distancia_metro         -0.08709169 0.0047532110 -18.322706 1.188622e-74

Ejercicio 2: Efecto de la distancia a un supermercado

Repetir el ejercicio anterior para los supermercados, galerias de alimentación y mercadillos

Ejercicio 3: Visualización de oportunidades

  • Identificar los inmuebles que tienen un precio por metro cuadrado mucho menor que la media de su barrio

  • Visualizar dichos inmuebles en un mapa